package com.faithbj.process;

import com.faithbj.common.model.CheckTotal;

import java.util.List;
import java.util.Map;

/**
 * 针对dana应用程序做的Facade, 调用方无脑调用即可.
 * User: xiongyuanwei
 * Date: 12-7-10
 * Time: 上午10:45
 */
public interface ProcessApplicationService {

    /**
     * 启动流程, 并完成"业务受理"任务.
     * @param checkTotal 要求设置受理人, 受理意见等
     */
    void startAndFinishArriveTask(CheckTotal checkTotal);

    /**
     * 接受并开始任务.
     * @param taskId 任务id
     */
    boolean claimAndGroupStartTask(long taskId);

    /**
     * 完成任务.
     * @param taskId 任务id
     * @param checkTotal checkTotal
     */
    void completeTask(long taskId, CheckTotal checkTotal);

    void completeTask(long taskId, CheckTotal checkTotal, Map<String, Object> output);

    void completeGroupTask(long taskId, CheckTotal checkTotal);

    void completeGroupTask(long taskId, CheckTotal checkTotal, Map<String, Object> output);

    /**
     * 任务失败.
     * @param taskId taskId
     * @param fault 失败原因
     */
    void fail(long taskId, String fault);

    /**
     * 获取所有用户的待办任务.
     * 包含流程变量.
     * @param state 任务节点
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAllAvailableTasksWithContentByState(State state, int first, int limit);

    int countAllAvailableTasksByState(State state);

    /**
     * 获取所有用户的待办任务.
     * 包含流程变量.
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAllAvailableTasksWithContent(int first, int limit);

    int countAllAvailableTasks();

    /**
     * 获取用户的待办任务.
     * 包含流程变量.
     * @param state 任务节点
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> listAvailableTasksWithContentByUserAndState(State state, int first, int limit);

    int countAvailableTasksByUserAndState(State state);

    /**
     * 根据任务id获取任务详情.
     * 包含流程变量.
     * @param taskId 任务id
     * @return TaskModel
     */
    TaskModel getTaskWithContent(long taskId);

    /**
     * 对当前用户的待办任务进行条件搜索.
     * @param condition 搜索条件
     * @param state 任务节点
     * @param first 分页参数
     * @param limit 分页参数
     * @return TaskModel列表, 按创建时间倒排
     */
    List<TaskModel> search(CheckTotalCondition condition, State state, int first, int limit);

    int countSearch(CheckTotalCondition condition, State state);

    TaskModel getTaskByProcessInstanceIdAndState(long processInstanceId, State state);

    TaskModel getTaskBySiblingTaskAndState(long siblingTaskId, State state);
}
